#include <iostream>
#include <vector>
#include <signal.h>
#include <unistd.h>
using namespace std;

#define MAX_SIGNAL_NUM 31
static vector<int> block_signal_vec{2, 3, 13}; // 用于存放需要被阻塞的信号

int main() {
    sigset_t block, oblock, pending;

    // 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);

    for (const auto& sig : block_signal_vec) {
        // 捕获被阻塞的信号，并将默认行为修改为自定义行为，避免信号阻塞被取消时进程直接被杀死
        signal(sig, [](int signo) -> void {
            cout << signo << "号信号已经递达！！！" << endl;
        });

        // 添加被阻塞的信号
        sigaddset(&block, sig);
    }

    // 正式用block设定被阻塞的信号，原来的信号屏蔽字(阻塞信号集)被存放到oblock中
    sigprocmask(SIG_SETMASK, &block, &oblock);

    // 展示未决集中的信号
    auto show_pending = [](const sigset_t& pending) -> void {
        for (int sig = MAX_SIGNAL_NUM; sig >= 1; --sig) {
            if (sigismember(&pending, sig)) {
                cout << "1" << " ";
            }
            else {
                cout << "0" << " ";
            }
        }

        cout << endl;
    };

    // 闹钟的自定义行为, 恢复对信号屏蔽字的修改，不屏蔽任何信号
    signal(SIGALRM, [](int sig) -> void {
        // ... 无法设定恢复，很难办啊
        //sigprocmask(SIG_SETMASK, &oblock, &block)
        cout << "恢复" << endl;
        alarm(10);
    });

    alarm(10);
    while (true) {
        // 获取pcb中未决信号集, 一直获取，一直更新
        sigpending(&pending);
        // 打印未决信号集中的内容
        show_pending(pending);

        // 慢一点
        sleep(1);
    }
    return 0;
}